// 循环队列是一个环状队列，简单来说就是队头位置和队尾位置是相连的，循环队列建议基于数组实现，也可以使用链表来实现（但是这样就变成来循环链表了，不建议这样做）

//  循环队列，我们不在认为数组的最后一个索引位置的下一个位置为null，而是指向索引为 0 的地方

// 有两个注意点， 当入队时 _tail++ 的值等于 _space 时， 需要将 _tail 赋值为 0，同理出队时 _head++ 的值等于 _space 时， 需要将 _head 赋值为 0，这样就形成了循环
// 将其置为 0 是因为满了或为空以后，下一次添加一定是在队头（循环队列  --- 使用数组实现）

class CirCleQueue {
  _size = 0;
  _space = 0;
  _head = 0;
  _tail = 0;
  _arr = null;

  constructor(space) {
    if (!space || space <= 0) {
      throw new Error("space must be > 0");
    }
    this._space = space;
    this._arr = new Array(this._space);
  }

  // 入队
  push(item) {
    if (this._size === this._space) {
      console.log("队列已满");
      return false;
    }
    this._arr[this._tail] = item;
    this._tail++;
    this._size++;
    if (this._tail === this._space) {
      this._tail = 0;
    }
    return true;
  }

//   出队
 pop() {
    if (this._size === 0) {
      console.log("队列为空");
      return
    }
    const item = this._arr[this._head]
    this._arr[this._head] = null
    this._head++;
    this._size--;
    if (this._head === this._space) {
        this._head = 0
    }
    return item
 }

 size () {
    return this._size
 }

 isEmpty () {
    return this._size === 0 ? true : false
 }

 getArr() {
    return this._arr
 }

 print() {
    if (this._size === 0) {
        console.log("队列为空")
        return
    }
    for (let i = 0; i < this._space; i++) {
        console.log(this._arr[i])
    }
 }
}

const circleQueue  = new CirCleQueue(5)

circleQueue.push(1)
circleQueue.push(2)
circleQueue.push(3)
circleQueue.push(4)
circleQueue.push(5)
circleQueue.push(6)
console.log(circleQueue.getArr());
circleQueue.print()
// console.log('--------');
// circleQueue.pop()
// circleQueue.print()
// circleQueue.pop()

// circleQueue.pop()
// console.log('--------');
// circleQueue.print()

